package com.company.剑指offer每日刷题.专项版;

//二进制加法
public class AddBinary {
    /**
     * 给定两个 01 字符串a和b，请计算它们的和，并以二进制字符串的形式输出。
     *
     * 输入为 非空 字符串且只包含数字1和0。
     * 示例1:
     *
     * 输入: a = "11", b = "10"
     * 输出: "101"

     * 提示：
     * 每个字符串仅由字符 '0' 或 '1' 组成。
     * 1 <= a.length, b.length <= 10^4
     * 字符串如果不是 "0" ，就都不含前导零。
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/JFETK5
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     * */

    public static void main(String[] args) {
        AddBinary obj = new AddBinary();
        String s = obj.addBinary("1", "111");
        System.out.println(s);

    }
    /**
     * 解决思路：进位法
     * */
    public String addBinary(String a, String b) {
        StringBuilder aStr = new StringBuilder(a);
        StringBuilder bStr = new StringBuilder(b);
        aStr.reverse();
        bStr.reverse();
        int alen = aStr.length();
        int blen = bStr.length();
        if(alen > blen){
            for (int i=0;i<alen-blen;i++){
                bStr.append('0');
            }
        }else if(blen > alen){
            for (int i=0;i<blen-alen;i++){
                aStr.append('0');
            }
        }
        int currentLen = aStr.length();
        short jinwei =0;
        StringBuilder res = new StringBuilder("");
        for (int i = 0; i < currentLen; i++) {
            short aNum = Short.parseShort(aStr.substring(i,i+1));
            short bNum = Short.parseShort(bStr.substring(i,i+1));
            res.append((aNum + bNum +jinwei) % 2);
            jinwei = (short) ((aNum + bNum +jinwei) / 2);
        }
        if(jinwei != 0)
        res.append(jinwei);
        return res.reverse().toString();
    }
}
